package progress.exa30_3;

import java.lang.reflect.*;

public class MethodTableTest {

    public static void main(String[] args) throws Exception {

        //获取类MethodTableTest中定义的square(double x)方法对象
        Method square = MethodTableTest.class.getMethod("square", double.class);
        //获取类Math中定义的sqrt(double x)方法对象
        Method sqrt = Math.class.getMethod("sqrt", double.class);
        //通过反射执行
        printTable(1, 10, 10, square);
        printTable(1, 10, 10, sqrt);
    }


    /**
     * 定义计算一个数值的平方的方法
     * @param x
     * @return
     */
    public static double square(double x) {
        return x * x;
    }


    /**
     * 这个方法打印出区间 from-to 指定步长的值，并打印出其平方数
     * @param from 小边界值
     * @param to 大边界值
     * @param n 个数
     * @param f 方法对象
     */
    public static void printTable(double from, double to, int n, Method f) {
        //打印出Method所描述的方法
        System.out.println(f);
        //步长
        double dx = (to - from) / (n - 1);

        for (double x = from; x <= to; x += dx) {
            try {
                //执行Method所描述的方法
                double y = (Double) f.invoke(null, x);
                System.out.printf("%10.4f | %10.4f%n", x, y);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }
}
